package cn.ant.mqHandle;

import cn.ant.config.RabbitMQConfig;
import cn.ant.entity.MessageSendDTO;
import com.alibaba.fastjson2.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * 生产者代码
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
@RequiredArgsConstructor
public class ProducerSend {

    private final RabbitTemplate rabbitTemplate;

    /***
     * 这是优化后，发送的消息携带ttl过期的生产者
     * 生产者方法
     * @param msg 消息
     * @param ttl 过期时间（秒）
     */
    public void producerSendMsgSimple(MessageSendDTO msg, Integer ttl) {
        //消息转换为JSON格式并转为字节数组
        byte[] bytes = JSONObject.toJSONString(msg).getBytes(StandardCharsets.UTF_8);
        //发送消息
        rabbitTemplate.convertAndSend(
                RabbitMQConfig.DELAY_DIRECT_EXCHANGE,
                RabbitMQConfig.SIMPLE_ROUTING_KEY,
                bytes, message -> {
                    // 这条消息的过期时间也被设置成了ttl秒 , 超过ttl秒未处理则执行到此消息后被丢弃。
                    // 记住是执行到此消息后被丢弃，后面说明
                    message.getMessageProperties().setExpiration(String.valueOf(ttl * 1000));
                    // 设置好了一定要返回
                    return message;
                });
    }

//    /***
//     * 生产者方法
//     * @param msg 消息
//     */
//    public void producerSendMsg(MessageSendDTO msg) {
//        // 消息转换为JSON格式并转为字节数组
//        byte[] bytes = JSONObject.toJSONString(msg).getBytes(StandardCharsets.UTF_8);
//        // 发送消息
//        rabbitTemplate.convertAndSend(RabbitMQConfig.DELAY_DIRECT_EXCHANGE,
//                RabbitMQConfig.DELAY_ROUTING_KEY, bytes);
//        log.info("生产者发送信息完成，已经交由给延迟直接交换机.....");
//    }
}
